在蓝鸟承诺中使用异步包
Using async package inside blue bird promises
我想知道我是否在 promise 中使用异步,如下所示:
new Promise(function(resolve, reject) {
async.mapLimit(files, 3000, function(file, callback) {
//
//
}, function(result) {
//
});
});
我这样做是因为我最多需要处理 3000 个文件,但如果超过 9000 个,我需要在调用堆栈中的其他函数之前处理所有文件。
例如,我使用的是新的 Promise,但我在实际代码中使用的是 promisifyAll。哪个是 "same"
我有这个 MainObject:
var MyObject = {}
内部,我有 4 个步骤,我正在使用 promisifyAll,因为我需要等待一个步骤完成,然后再调用另一个步骤,如下所示:
var MyObject = {
stepOne: function(files, callback) {
},
stepTwo: function(files, callback) {
},
stepThree: function(files, callback) {
},
stepFour: function(files, callback) {
}
};
Promise.promisifyAll(MyObject);
问题是,在哪一步(我在这里处理文件)我只允许程序 运行 3.000 异步,所以为了实现这个,我使用以下内容:
async.mapLimit(files, 3000, function() {
}, function(result) {
});
因此,最终代码将是:
var MyObject = {
stepOne: function(files, callback) {
async.mapLimit(files, 3000, function() {
}, function(result) {
});
},
stepTwo: function(files, callback) {
async.mapLimit(files, 3000, function() {
}, function(result) {
});
},
stepThree: function(files, callback) {
async.mapLimit(files, 3000, function() {
}, function(result) {
});
},
stepFour: function(files, callback) {
async.mapLimit(files, 3000, function() {
}, function(result) {
});
}
};
只需使用 Bluebird 的 Promise.map()
并传递并发选项:
Promise.map(files, function(file) {
// process the file here, return result or promise of result
}, {concurrency: 3000}).then(...)
文档和代码示例 here。
当然,您可以在 promise 中使用异步,但我不推荐这样做:
var p = new Promise(function(resolve, reject) {
async.mapLimit(files, 3000, function(file, callback) {
//
//
callback(null, result);
}, function(err, results) {
if (err) {
reject(err);
} else {
resolve(results);
}
});
});
同样,我建议使用 Promise.map()
:
var MyObject = {
stepOne: function(files) {
return Promise.map(files, function(file) {
// process a file
// return result or promise of result
}, {concurrency: 3000});
},
stepTwo: function(files) {
return Promise.map(files, function(file) {
// process a file
// return result or promise of result
}, {concurrency: 3000});
},
stepThree: function(files) {
return Promise.map(files, function(file) {
// process a file
// return result or promise of result
}, {concurrency: 3000});
},
stepFour: function(files) {
return Promise.map(files, function(file) {
// process a file
// return result or promise of result
}, {concurrency: 3000});
};
那么,就不需要 promisifyAll()
,因为这些方法已经使用了 promises。
MyObject.stepOne(files).then(MyObject.stepTwo).then(MyObject.stepThree).then(MyObject.stepFour);
我想知道我是否在 promise 中使用异步,如下所示:
new Promise(function(resolve, reject) {
async.mapLimit(files, 3000, function(file, callback) {
//
//
}, function(result) {
//
});
});
我这样做是因为我最多需要处理 3000 个文件,但如果超过 9000 个,我需要在调用堆栈中的其他函数之前处理所有文件。
例如,我使用的是新的 Promise,但我在实际代码中使用的是 promisifyAll。哪个是 "same"
我有这个 MainObject:
var MyObject = {}
内部,我有 4 个步骤,我正在使用 promisifyAll,因为我需要等待一个步骤完成,然后再调用另一个步骤,如下所示:
var MyObject = {
stepOne: function(files, callback) {
},
stepTwo: function(files, callback) {
},
stepThree: function(files, callback) {
},
stepFour: function(files, callback) {
}
};
Promise.promisifyAll(MyObject);
问题是,在哪一步(我在这里处理文件)我只允许程序 运行 3.000 异步,所以为了实现这个,我使用以下内容:
async.mapLimit(files, 3000, function() {
}, function(result) {
});
因此,最终代码将是:
var MyObject = {
stepOne: function(files, callback) {
async.mapLimit(files, 3000, function() {
}, function(result) {
});
},
stepTwo: function(files, callback) {
async.mapLimit(files, 3000, function() {
}, function(result) {
});
},
stepThree: function(files, callback) {
async.mapLimit(files, 3000, function() {
}, function(result) {
});
},
stepFour: function(files, callback) {
async.mapLimit(files, 3000, function() {
}, function(result) {
});
}
};
只需使用 Bluebird 的 Promise.map()
并传递并发选项:
Promise.map(files, function(file) {
// process the file here, return result or promise of result
}, {concurrency: 3000}).then(...)
文档和代码示例 here。
当然,您可以在 promise 中使用异步,但我不推荐这样做:
var p = new Promise(function(resolve, reject) {
async.mapLimit(files, 3000, function(file, callback) {
//
//
callback(null, result);
}, function(err, results) {
if (err) {
reject(err);
} else {
resolve(results);
}
});
});
同样,我建议使用 Promise.map()
:
var MyObject = {
stepOne: function(files) {
return Promise.map(files, function(file) {
// process a file
// return result or promise of result
}, {concurrency: 3000});
},
stepTwo: function(files) {
return Promise.map(files, function(file) {
// process a file
// return result or promise of result
}, {concurrency: 3000});
},
stepThree: function(files) {
return Promise.map(files, function(file) {
// process a file
// return result or promise of result
}, {concurrency: 3000});
},
stepFour: function(files) {
return Promise.map(files, function(file) {
// process a file
// return result or promise of result
}, {concurrency: 3000});
};
那么,就不需要 promisifyAll()
,因为这些方法已经使用了 promises。
MyObject.stepOne(files).then(MyObject.stepTwo).then(MyObject.stepThree).then(MyObject.stepFour);