2016-08-07 1 views
2

Я хотел бы знать, как мне сделать, чтобы вызвать функцию в обещании в выборке?функция вызова в обещании выборки без этого

Обратите внимание эту строку: .then(json => this.processReq(json))

я должен использовать this., потому что если не он говорит, что processReq является undefined. Не должно быть что-то вроде: .then(json => processReq(json)) из-за ES6 ??

это мой код (я использую Babel ES6 и React):

import React, { Component, PropTypes } from 'react' 
import fetch from 'isomorphic-fetch' 

export default class Batchprodpry extends Component { 
    constructor(props) { 
    super(props) { 
    . 
    . 
    . 
    processReq(json) { 
    Object.keys(json).forEach(item => { 
     if (item === 'error') { 
     Object.keys(json[item]).forEach(propry => { 
      alert('Conflicto! '+'\n'+ 
      'Id: ' + JSON.stringify(json[item][propry]['propryid'])+'\n'+ 
      'Id Operador: ' + JSON.stringify(json[item][propry]['fkempid'])+'\n'+ 
      'Hora inicio: ' + JSON.stringify(json[item][propry]['propryhoraini'])+'\n'+ 
      'Hora fin: ' + JSON.stringify(json[item][propry]['propryhorafin']))   
     }) 
     } 
    }) 
    } 
    . 
    . 

    postForm() { 
    let maq = this.state.obj['fkmaqid'] 
    return fetch(`/scamp/index.php/batchprodpry/${maq}`, { 
     method: 'POST', 
     credentials: 'same-origin', 
     headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json' 
     }, 
     body: JSON.stringify(this.state.a) 
    }) 
    .then(req => { 
     if (req.status >= 400) { 
     throw new Error("Bad response from server") 
     } 
     return req.json() 
    }) 
    .then(json => this.processReq(json)) 
    .catch(function(error) { 
     console.log('request failed', error) 
    }) 
    } 
+1

"* Не должно быть что-то вроде [...] из-за ES6 ?? *" - Нет, зачем? 'processReq' по-прежнему является методом экземпляра. – Bergi

+0

Я обновил свой вопрос –

+2

после вашего обновления, 'processReq' по-прежнему является методом экземпляра, а не локальной переменной. локальные переменные объявляются только с ключевыми словами 'var' и' let', вы используете синтаксис ES6, как определять методы, на которые ссылается 'this' – Aprillion

ответ

3

No.

Использование ES6 fat-arrow function означает, что this связан с чем-то другим, чем тело функции в рука.

Если вы использовали синтаксис ES5, чтобы выразить подобную функцию, this будет связан с телом функции и this.processReq будет неопределенным:

function (json) { 
    return this.processReq(json); // undefined 
} 

Так эквивалент ES5 должен быть:

var self = this; 
return fetch(...) 
    .then(function (json) { 
    return self.processReq(json); 
    }); 

Как и в вашем конкретном примере, this относится к экземпляру класса Batchprodpry. Существует нет локальной функции с именем processReq, только метод, определенный для экземпляра класса.

+0

Итак, в обещаниях функции, вызываемые без' this.', относятся к локальным , и даже если я использую ES6 со стрелками, я все равно должен использовать 'this.' ?? –

+0

Я обновил вопрос методом 'processReq' –

+1

, потому что вы используете ES6, вы ** можете ** использовать' this' - в ES5 было бы бесполезно – Aprillion