【发布时间】:2018-07-24 17:12:18
【问题描述】:
我的异步函数在请求完成之前进入 then。 然后部分代码不应该只在异步功能完成后执行吗?如何在所有函数执行完毕后才调用函数?
app.js
var request_test = require('./request_test');
baseUrl = "https://github.com";
promiseFunction().then((result)=>{
console.log("complete")
});
var promiseFunction = async function promiseFunction() {
request_test.request_test(baseUrl);
}
request_test.js
var request = require('request');
var cheerio = require('cheerio');
var request_test = function check(baseUrl) {
console.log("baseUrl:" + baseUrl)
var options = {
url: baseUrl
};
request(options, function (error, response, html) {
if (!error) {
console.log("no error");
}else{
console.log("else js");
console.log(error);
}
});
}
module.exports = {
request_test: request_test
};
【问题讨论】:
-
async没有检测完成的魔力。如果request_test.request_test(baseUrl);是一个异步函数,那么它必须要么返回一个在异步操作完成时履行的承诺,要么它必须接受一个回调。如果它返回一个承诺,那么您可以从父函数返回该承诺,然后您可以在父函数上使用.then()。看来您期待promiseFunction()神奇地知道request_test.request_test(baseUrl);何时完成其异步操作。它不知道。 -
相反,您需要让
request_test.request_test(baseUrl);返回一个与其异步操作相关联的承诺。然后,您可以从promiseFunction()返回该承诺,然后promiseFunction().then()将正常工作。 -
不知道需要 promise 以确保 then 工作。在 request_test 模块中添加了 promise 并在 promiseFunction 中等待,它可以按需要工作。感谢您指出。
标签: node.js asynchronous request