我是异步调用和 promise 的新手。我想调用三个调用数据库的函数。我需要得到这些结果并对其进行处理。我用 Promise 来实现它。它不起作用,因为我想我一定没有采取正确的方式,请提出建议。感谢您的任何回答。我在 NODE JS 中使用。 数据库函数似乎可以工作,它通过三个查询调用数据库。
代码
function nested_three_Promise_call_three_function(){
new Promise(function (resolve, reject) { return sample(); })
.then(
function (val) {
new Promise(function (resolve, reject) { sample1(); })
.then(
function (val) {
new Promise(function (resolve, reject) { sample2(); })
.then({
function(val) {
/* NEED TO GET VALUE OF ALL SAMPLE,SAMPLE1,SAMPLE 2 FOR FURTHER PROCESS BEFORE SEND TO RESPONSE*/
console.log("sample" + sample);
console.log("sample1" + sample1);
console.log("sample2" + sample2);
},
function(err){
console.log("error inside promise for sample2");
}
})
},
function (err) {
console.log("error inside promise for sample1");
}
)
},
function (error) {
console.log("error inside promise for sample1");
});
}
function sample() {
console.log("sample called");
database.query("select * from sample").then(function(result){
sample = result;
}).catch(function(error){
console.log("error occured in sample")
});
}
function sample1() {
console.log("sample called");
database.query("select * from sample1").then(function(result){
sample1 = result;
}).catch(function(error){
console.log("error occured in sample1")
});
}
function sample2() {
console.log("sample called");
database.query("select * from sample2").then(function(result){
sample2 = result;
}).catch(function(error){
console.log("error occured in sample2")
});
}
最佳答案
这里有几个问题:
您的
sampleX
函数不会返回任何内容。您的
sampleX
函数应该只返回 promisequery
返回的内容。您创建了不必要的 promise 。
所以首先要做的就是改变:
function sample() {
console.log("sample called");
database.query("select * from sample").then(function(result){
sample = result;
}).catch(function(error){
console.log("error occured in sample")
});
}
至:
function sample() {
console.log("sample called");
return database.query("select * from sample");
}
...对于 sample1
和 sample2
也类似。
如果,正如您问题中的代码所建议的,没有一个函数使用其他函数的结果,您可以使用 Promise.all
:
function nested_three_Promise_call_three_function() {
Promise.all([sample(), sample1(), sample2()])
.then(function(results) {
// Use results[0], results[1], and results[2] here
console.log("From sample:", results[0]);
console.log("From sample1:", results[1]);
console.log("From sample2:", results[2]);
})
.catch(function(error) {
// Something went wrong
});
}
function sample() {
console.log("sample called");
return database.query("select * from sample");
}
function sample1() {
console.log("sample called");
return database.query("select * from sample1");
}
function sample2() {
console.log("sample called");
return database.query("select * from sample2");
}
数据库调用将并行运行,完成后您将获得结果。
<小时/>如果它们都需要前一个的结果,而你只需要最后的最终结果,那么你可以将它们链接起来;在下面,请注意 sample1
和 sample2
现在接受参数:
function nested_three_Promise_call_three_function() {
sample()
.then(sample1)
.then(sample2)
.then(function(result) {
// `result` is the result from sample2
})
.catch(function(error) {
// Something went wrong
});
}
function sample() {
console.log("sample called");
return database.query("select * from sample");
}
function sample1(arg) {
console.log("sample called");
// use arg here
return database.query("select * from sample1");
}
function sample2(arg) {
console.log("sample called");
// use arg here
return database.query("select * from sample2");
}
<小时/>
如果您需要将先前的结果传递到后续函数并且最后得到所有结果,您可能有多种选择,但首先想到的就是跟踪他们是您调用电话的地方:
function nested_three_Promise_call_three_function() {
let sampleResult, sample1Result;
sample()
.then(function(result) {
sampleResult = result;
return sample1(result);
})
.then(function(result){
sample1Result = result;
return sample2(result);
})
.then(function(sample2Result) {
// `sampleResult`, `sample1Result`, and `sample2Result` have the results here
})
.catch(function(error) {
// Something went wrong
});
}
function sample() {
console.log("sample called");
return database.query("select * from sample");
}
function sample1(arg) {
console.log("sample called");
// use arg here
return database.query("select * from sample1");
}
function sample2(arg) {
console.log("sample called");
// use arg here
return database.query("select * from sample2");
}
关于javascript - 如何使用嵌套promise调用函数并获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38934086/