在javascript中为数组循环创建异步函数?

在javascript中为数组循环创建异步函数?,javascript,arrays,asynchronous,Javascript,Arrays,Asynchronous,我从未(有意地)在javascript中使用过异步函数。 我必须执行一个赋值,该赋值要求我对数组元素使用异步函数(即for(让I=0;IJavascript中的异步函数是一个立即返回Promise并在将来某个点完成运行的函数) 与C或Java不同,Javascript只是单线程的,因此不要将异步函数误认为是在单独的线程中运行的函数:所有代码都在同一个线程中运行,因此完全按顺序运行。在异步Javascript函数中,您所能做的就是将工作延迟到稍后的某个时间 这意味着异步函数对于获取远程数据、超时或

我从未(有意地)在javascript中使用过异步函数。
我必须执行一个赋值,该赋值要求我对数组元素使用异步函数(即
for(让I=0;IJavascript中的异步函数是一个立即返回
Promise
并在将来某个点完成运行的函数)

与C或Java不同,Javascript只是单线程的,因此不要将异步函数误认为是在单独的线程中运行的函数:所有代码都在同一个线程中运行,因此完全按顺序运行。在异步Javascript函数中,您所能做的就是将工作延迟到稍后的某个时间

这意味着异步函数对于获取远程数据、超时或在继续之前等待用户事件的代码非常有用

您可以在此处使用
setTimeout
模拟异步函数:

function delayedPopulateResults(index, number) {
    return new Promise(function(resolve) {
        setTimeout(function() { resolve(populateResults(index, number); },
            Math.random());
    });
}
现在,如果您调用
delayedPopulateResults
而不是
populateResults
,那么您的第二个代码块将创建所有承诺,并在完成时记录结果。但请记住,所做的只是在代码执行之前引入随机延迟:因此对
populateResults()的调用
将以随机顺序执行,但在下一个运行之前,每个都必须完成


如果可以使用最新版本的Ecmascript(ES7)然后您可以使用
async
wait
关键字来简化此过程,但要在浏览器中运行代码,您可能需要使用诸如Babel或Typescript之类的transpiler在ES5中呈现代码。

PopulateResult
不是异步函数,它只是一个普通函数,因此它将在您之前完全执行甚至将其推入
promises
,尽管其名称不包含任何承诺。使用返回
Promise
的实际异步函数重试,您可能会看到不同的结果。您尝试过闭包吗?示例:查看SimpleJ在此处使用的回答
setTimeout()
Promise.all
已经以并行方式异步解析所有承诺,只要所有承诺都完成了,它就会返回,但实际上它确实以并行方式执行所有元素。您的代码中没有得到什么?是否希望对执行的每个承诺进行回调,并希望执行所有承诺并行?@KristjanKica:不,函数是以并行方式运行的,只是你看不到这一点,因为你只调用了一次结果。下面的一个例子可以让你更清楚地了解发生了什么:所有的承诺都是以并行方式启动的。我正在为每个回调处理一个泛型,以证明它们所有这些都是以并行方式执行的。如果您希望它们按顺序执行,并使一个在另一个之后开始,那么这就是另一种情况。准确地了解您需要什么可能会有所帮助。
let promises = [];
for (var i=0;i<unique.length;i++) {
    promises.push(populateResults(i,unique[i]));
}

Promise.all(promises).then(function(results){
   console.log(results);
}).catch(function(err) {
    // handle error here
});
function delayedPopulateResults(index, number) {
    return new Promise(function(resolve) {
        setTimeout(function() { resolve(populateResults(index, number); },
            Math.random());
    });
}