Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺。所有工作都不在预期范围内_Javascript_Node.js_Promise - Fatal编程技术网

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
中的所有代码都是同步的。完美!非常感谢你!