gpt4 book ai didi

node.js - 从 then 函数内访问 Promise 对象

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:36 25 4
gpt4 key购买 nike

我正在使用node.js的Q库。我正在尝试打印一份报告,该报告将打印查询名称和结果。这就是我所拥有的。代码打印“在函数未定义中。如何从“then”函数中访问 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();
});

最佳答案

This is what I have:

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

The code prints "In function undefined".

The spec要求调用回调时不提供任何 this 值,因此 this 将在草率模式下引用全局 (window) 对象,该对象没有 .query 属性。在严格模式下,当 thisundefined 时,您会收到异常。

How do I access the value of the promise object from within the "then" function ?

没有特殊的方法。您通常不需要将 Promise 作为对象来访问,它只是一个代表异步计算的单个结果的透明值。您需要做的就是调用它的 .then() 方法 - 在回调内部,没有理由访问 Promise 对象,因为您已经可以访问它所保存的信息(data,以及调用履行回调的事实)。

因此,如果您想访问 .query 属性,则必须像往常一样使用 promises[i] 。然而,you will need a closure对于 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);
});

关于node.js - 从 then 函数内访问 Promise 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27604262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com