2014-12-22 3 views
1

Я использую библиотеку Q node.js. Я пытаюсь напечатать отчет, который будет печатать имя запроса и результат. Это то, что у меня есть. Кодовые печатает «. В функции неопределенные Как получить доступ к значению объекта обещание внутри„функции затем“Доступ к объекту обещания из функции then

var queries = ["2091 OR 2092 OR 2093", 
      "2061 OR 2062", 
      "2139 OR 2140 OR 2141" 
      ]; 

var promises = new Array(); 
for (var i=0; i<queries.length; i++) { 
    promises[i]=performSearch(queries[i]); 
    promises[i].query = queries[i]; 
    console.log("Outside function ", promises[i].query); 

    promises[i].then(function(data) { 
      console.log("In function ", this.query); 
      processSearchResults(data,this.query); 
    }); 
} 
Q.allSettled(promises).then(function(results) { 
    endFunction(); 
}); 
+1

если 'performSearch' возвращает обещание, то' данные 'также является обещанием. –

+0

@BenFortune: 'data' не является обещанием - это не должно быть обещанием по спецификации? – Bergi

+0

Данные @BenFortune не являются обещанием. Я установил свойство запроса на объект обещания. Я хочу получить доступ к этому свойству из функции then –

ответ

0

Это то, что у меня есть:

promises[i].then(function(data) { 
     console.log("In function ", this.query); 
     processSearchResults(data,this.query); 
}); 

Кодекса печатает «в функции не определены».

The spec мандаты, что обратный вызов вызываются ни с чем значением this, так this будет ссылаться на глобальный объект (window) в неаккуратном режиме, который не имеет свойства .query. В строгом режиме вы получили бы исключение, если this был undefined.

Как получить доступ к значению объекта обещания из функции «then» ?

Специального метода нет. Обычно вам не нужно обращаться к обещанию как к объекту, это только прозрачное значение, представляющее единственный результат асинхронного вычисления. Все, что вам нужно сделать, это вызвать его метод .then() - и внутри обратного вызова нет причин для доступа к объекту обещания, потому что имеющаяся информация уже доступна вам (data и тот факт, что был вызван обратный вызов выполнения).

Так что, если вы хотите получить доступ к своему имуществу .query, вам нужно будет использовать promises[i], как обычно. Тем не менее, you will need a closure для i поэтому лучше использовать map в любом случае и удерживайте query строку в замыкании непосредственно вместо того, чтобы это свойство на обещание объекта:

var queries = ["2091 OR 2092 OR 2093", 
      "2061 OR 2062", 
      "2139 OR 2140 OR 2141" 
      ]; 

var promises = queries.map(function(query) { 
    var promise = performSearch(query); 
    console.log("Outside function ", query); 
    var processedPromise = promise.then(function(data) { 
     console.log("In function ", query); 
     return processSearchResults(data, query); 
    }); 
    return processedPromise; // I assume you don't want the unprocessed results 
}); 
Q.allSettled(promises).then(function(processedResults) { 
    endFunction(processedResults); 
}); 
+0

Спасибо. Работает так, как ожидалось. –

Смежные вопросы