从then函数中访问promise对象

时间:2014-12-22 14:05:23

标签: node.js asynchronous scope promise q

我正在使用node.js的Q库。我正在尝试打印一个报告,该报告将打印查询名称和结果。这就是我所拥有的。代码打印"在函数undefined中。如何从"然后"中访问promise对象的值。功能?

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 个答案:

答案 0 :(得分:1)

  

这就是我所拥有的:

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

代码打印&#34;在函数undefined&#34;。

The spec强制要求调用回调,而this值没有任何内容,因此this将以草率模式引用全局(window)对象,没有.query属性。在严格模式下,thisundefined时,您会遇到异常。

  

如何从&#34;然后&#34;中访问promise对象的值。   功能?

没有特殊方法。您通常不需要将promise作为对象访问,它只是表示异步计算的单个结果的透明值。您需要做的就是调用它的.then()方法 - 并且在回调中,没有理由访问promise对象,因为它所拥有的信息已经可以访问({{1 ,以及调用履行回调的事实。)

因此,如果您想访问data媒体资源,则必须像往常一样使用.query。但是promises[i]i,因此您最好使用map并直接在闭包中保留query字符串,而不是将其作为promise对象的属性:

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);
});