Suk*_*lli 2 javascript for-loop callback node.js
我试图在for循环中编写一个函数.但是循环不会等到获得内部函数的响应.如何在每次获得函数响应之前停止循环?
在此过程中,下一个循环取决于函数的响应.
我的示例代码:
var a = function(data, callback) {
var d = 1;
for (var i = 0; i < data.length; i++) {
b(d, function(err, result) {
if (!err) {
d = result;
}
if ((i + 1) === data.length) {
callback(err, 'something');
}
});
}
}
var b = function(data, callback) {
var c = data + 1;
callback(null, c);
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中,for循环不会等到它从函数获得响应b.
您可以通过在回调中调用递归函数调用来轻松迭代输入数组:
'use strict';
const a = function(data, callback) {
let i = 0;
let sum = 0;
// loop function
function next() {
const x = data[i++];
if (!x) {
return callback(null, sum);
}
return b(x, (err, data) => {
sum += data;
next();
});
}
next(); // starts iterating
}
// multiplies data * 3
const b = function(data, callback) {
let c = data * 3;
callback(null, c);
}
a([1, 2, 3], (err, data) => {
console.log(data); // prints 18
});
Run Code Online (Sandbox Code Playgroud)
您的代码可以轻松重构以使用Promises:
function a (data) {
let promise = Promise.resolve(1);
for (let i = 0; i < data.length; i++) {
promise = promise.then(b);
}
return promise.then(function (v) {
// v is the value computed by the promise chain
return 'something';
});
}
function b (data) {
// some async action that returns a promise
return Promise.resolve(data + 1);
}
Run Code Online (Sandbox Code Playgroud)
用法:
a(['a', 'b', 'c']).then(result => console.log(result)); // logs 'something'
Run Code Online (Sandbox Code Playgroud)
使用 Promise 允许您使用async function像对待同步代码一样对待异步代码:
async function a (data) {
let v = 1;
for (let i = 0; i < data.length; i++) {
// looks like synchronous code, but is asynchronous
v = await b(v);
}
// v is the value computed by the asynchronous loop
return 'something';
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4555 次 |
| 最近记录: |