Javascript 承诺。所有工作都不在预期范围内
我期待着承诺。所有代码都会返回Javascript 承诺。所有工作都不在预期范围内,javascript,node.js,promise,Javascript,Node.js,Promise,我期待着承诺。所有代码都会返回 { constant: 'x1' } { constant: 'x2' } { constant: 'x3' } 但我有一个: { constant: 'x1' } { constant: 'x12' } { constant: 'x123' } 为什么会发生这种情况?我似乎看不到“常数”在哪里积累 这是一个简化的视图-我实际上在“testFN”中更新/创建了一个文档 谢谢 function testFN(blob, array, iter){ var
{ constant: 'x1' }
{ constant: 'x2' }
{ constant: 'x3' }
但我有一个:
{ constant: 'x1' }
{ constant: 'x12' }
{ constant: 'x123' }
为什么会发生这种情况?我似乎看不到“常数”在哪里积累
这是一个简化的视图-我实际上在“testFN”中更新/创建了一个文档
谢谢
function testFN(blob, array, iter){
var newBlob = blob;
newBlob.constant = blob.constant+array.num
console.log(newBlob);
return products.findOneAndUpdate ....
}
exports.updateProductId = function(req, res) {
var blob = {"constant":"x"};
var arr = { key1:{num: "1"}, key2:{num: "2"}, key3:{num: "3"}};
var fnArr = [];
Object.keys(arr).forEach(function(key, i) {
fnArr.push(testFN(blob, arr[key], i));
});
return Promise.all(fnArr)
.then(function(success){
console.log(success);
})
.catch(function(error){
console.log(error);
})
})
非原语通过引用传递-您可以将表示对象的任何变量视为对内存位置的引用。因此,在
testFN
中:
function testFN(blob, array, iter){
var newBlob = blob;
newBlob.constant = blob.constant+array.num
newBlob
指向内存中与blob
参数相同的位置,因此当您更改newBlob.constant
时,您也会更改原始的blob.constant
(因为它们是相同的对象)。您可以通过将blob
的真实副本分配给newBlob
来修复它:
功能测试fn(blob、阵列、iter){
var newBlob=JSON.parse(JSON.stringify(blob));
newBlob.constant=blob.constant+array.num;
console.log(newBlob);
返回newBlob;
}
var blob={“常量”:“x”};
var arr={key1:{num:1},key2:{num:2},key3:{num:3};
var fnArr=[];
Object.key(arr.forEach)(函数(key,i){
推送(testFN(blob,arr[key],i));
});
承诺。所有(fnArr)
.然后(功能(成功){
console.log(成功);
})
.catch(函数(错误){
console.log(错误);
})
Promise.all可以使用Promises数组更改您的函数“testFN”以返回Promise
function testFN(blob, array, iter){
return new Promise(function(resolve, reject) {
var newBlob = blob;
newBlob.constant = blob.constant+array.num;
console.log(newBlob);
resolve();
});
}
但如果你需要承诺,你可能会看到什么。在这种情况下,一切都是如此。b因为这里没有任何异步操作为什么要使用带有静态值数组的
Promise.all()
?这不是它的目的,也不是它的用处。您将传递Promise.all()
一组承诺。然后,它监控所有这些承诺,并告诉您这些承诺何时完成。您只需向它传递一个已填充的值数组,这样它就可以返回相同的数组。您是否意识到,当您构造fnArr
时,您立即调用testFn()
,并将返回值推入fnArr
中,因此当您调用Promise.all()
,您是否意识到,您正在向它传递一个已填充了所有值的数组。您正在返回一个将解析为未定义的
-并且,您的数组传递给了promise。all是一个未定义的
-数组,代码中没有任何异步(直到您使用promise.all实现了此操作)promise.all()
部分代码与任何内容都无关。调用Promise.All()
之前,您的所有代码都已运行。所以,这个问题的标题是非常错误的。您似乎认为Promise.all()
对您的代码/数据做了它没有做的事情。事实上,在调用Promise.all()
之前,您所有的console.log()
语句(除了成功语句)都已经运行过了。为什么要在没有必要的地方引入异步呢?不知道为什么会被否决,问题是为什么Promise.all不起作用,原因在这里得到了明确的回答。还添加了一条注释,以重新考虑是否需要Promise.all?您的答案根本无法解决OP遇到的问题。无论testFN
是否返回承诺都是完全不相关的,因为testFN
中的所有代码都是同步的。完美!非常感谢你!