Javascript 把这个承诺拴起来

Javascript 把这个承诺拴起来,javascript,node.js,promise,Javascript,Node.js,Promise,当您需要将结果附加到位于函数作用域顶层的数组时,什么是链接内容的正确方法 function run() { let array = [] let input = 'object' promiseA(input) .then((result) => { array.push(result) }) promiseB(input) .then((result) => { array.push(re

当您需要将结果附加到位于函数作用域顶层的数组时,什么是链接内容的正确方法

function run() {
    let array = []

    let input = 'object'

    promiseA(input)
    .then((result) => {
        array.push(result)
    })

    promiseB(input)
    .then((result) => {
        array.push(result)
    })

    console.log(array.join(' '))
}

顺序对我的应用程序并不重要,如果这被认为是最佳实践,我可以将其并行化。它实际上只是检查一个条件,没有异步调用从API或类似的东西获取结果。

您应该使用Promise.all来等待Promise a和Promise B完成。Promise.all将收到一系列结果(来自每个Promise),您可以使用这些结果

您可能会遇到以下情况:

var promiseA =       doSomethingThatReturnsPromise(input);
var promiseB = doSomethingThatReturnsPromise(anotherInput);

Promise.all([promiseA, promiseB]).then(function(resultsArray) { // do something });

你应该使用Promise.all来等待承诺A和承诺B完成。Promise.all将收到一系列结果(来自每个Promise),您可以使用这些结果

您可能会遇到以下情况:

var promiseA =       doSomethingThatReturnsPromise(input);
var promiseB = doSomethingThatReturnsPromise(anotherInput);

Promise.all([promiseA, promiseB]).then(function(resultsArray) { // do something });

您的函数将如下所示

function run () {
 return Promise.all([promiseA(), promiseB()]).then(([resultA, resultB])=>{ }) 
}

您的函数将如下所示

function run () {
 return Promise.all([promiseA(), promiseB()]).then(([resultA, resultB])=>{ }) 
}

另一种选择是使用
async
函数:

这种方法一个接一个地执行承诺,这样您就能够按照所需的执行顺序处理结果

功能承诺(输入){
返回新承诺(函数(解析){
setTimeout(函数(){
解析(输入);
}, 1000);
});
}
功能承诺书(输入){
返回新承诺(函数(解析){
setTimeout(函数(){
解析(输入);
}, 500);
});
}
异步函数run(){
让数组=[];
让输入='Ele';
array.push(等待承诺(输入));
输入=“来自SO”;
array.push(等待promiseB(输入));
console.log(array.join(“”))
}
log('等待1.5秒…')

run()
另一种方法是使用
async
函数:

这种方法一个接一个地执行承诺,这样您就能够按照所需的执行顺序处理结果

功能承诺(输入){
返回新承诺(函数(解析){
setTimeout(函数(){
解析(输入);
}, 1000);
});
}
功能承诺书(输入){
返回新承诺(函数(解析){
setTimeout(函数(){
解析(输入);
}, 500);
});
}
异步函数run(){
让数组=[];
让输入='Ele';
array.push(等待承诺(输入));
输入=“来自SO”;
array.push(等待promiseB(输入));
console.log(array.join(“”))
}
log('等待1.5秒…')

run()
回答问题

这是排序或链接承诺的正确方法:

one(arr).then(two).then(log, fail);
这直接回答了问题,而没有提供其他可能的解决方案

请注意没有副作用。评论中提到的“范围”问题是绝对避免的

示例代码段实现了以下功能:

让arr=[];
功能一(arr){
返回新承诺((res,rej)=>{
arr.push(“一”);
res(arr);
});
}
功能二(arr){
返回新承诺((res,rej)=>{
arr.push('two');
res(arr);
});
}
功能日志(arr){
控制台日志(arr);
}
功能失败(原因){
控制台日志(原因);
}

一个(arr)。然后(两个)。然后(记录,失败)回答问题

这是排序或链接承诺的正确方法:

one(arr).then(two).then(log, fail);
这直接回答了问题,而没有提供其他可能的解决方案

请注意没有副作用。评论中提到的“范围”问题是绝对避免的

示例代码段实现了以下功能:

让arr=[];
功能一(arr){
返回新承诺((res,rej)=>{
arr.push(“一”);
res(arr);
});
}
功能二(arr){
返回新承诺((res,rej)=>{
arr.push('two');
res(arr);
});
}
功能日志(arr){
控制台日志(arr);
}
功能失败(原因){
控制台日志(原因);
}

一个(arr)。然后(两个)。然后(记录,失败)需要清晰。你所说的“用数组链接某物”是什么意思?
promiseA()
promiseB()
的源代码是什么?您尝试过什么。独立地将对象添加到数组中(普通链接使数组超出范围),A和B只返回一个要追加的字符串。普通链接使数组超出范围-不,不。操作顺序与您预期的不同。如果您将其链接为
promiseA.then((resultA)=>{array.push(resultA);返回promiseB.then((resultB)=>{array.push(resultB)}}})
(这是链接它的一种不好的方式,但无论如何)它超出了范围。您可以在Plunker或fiddle中创建工作示例吗?需要澄清。你所说的“用数组链接某物”是什么意思?
promiseA()
promiseB()
的源代码是什么?您尝试过什么。独立地将对象添加到数组中(普通链接使数组超出范围),A和B只返回一个要追加的字符串。普通链接使数组超出范围-不,不。操作顺序与您预期的不同。如果您将其链接为
promiseA.then((resultA)=>{array.push(resultA);返回promiseB.then((resultB)=>{array.push(resultB)}}})
(这是链接它的一种不好的方式,但无论如何)它超出了范围。您能否在Plunker或fiddle中创建工作示例…Promise.all()这不是一条链子。它有效地与解析并行。我认为OP想要序列化执行。也许我们需要澄清。我知道什么是承诺,一切都是。它似乎符合提供的示例代码,但可能顺序对发布的问题很重要?Promise.all()不是一个链。它有效地与解析并行。我认为OP想要序列化执行。也许我们需要澄清。我知道什么是承诺,一切都是。它似乎符合提供的示例代码,但可能顺序对发布的问题很重要?这更符合我的要求,不像Promise那样“笨重”。All(),这有效吗
array.push(“最近的结果是:“+Wait promiseA(input))
@ARMATAV是的,它是有效的。这是我想要的,它没有我想要的那么“笨重”