Javascript 如何使用嵌套承诺调用函数并获取值
我不熟悉异步调用和承诺。我想调用三个调用数据库的函数。我需要得到这些结果并加以处理。我用承诺来实现它。它不工作,因为我认为我一定没有做正确的方式请建议。如蒙答复,不胜感激。我在NodeJS中使用。 数据库函数似乎在工作,它通过三个查询调用数据库 代码Javascript 如何使用嵌套承诺调用函数并获取值,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我不熟悉异步调用和承诺。我想调用三个调用数据库的函数。我需要得到这些结果并加以处理。我用承诺来实现它。它不工作,因为我认为我一定没有做正确的方式请建议。如蒙答复,不胜感激。我在NodeJS中使用。 数据库函数似乎在工作,它通过三个查询调用数据库 代码 这里有几个问题: 您的sampleX函数不会返回任何内容 您的sampleX函数应该只返回承诺queryreturns 你在不必要地做出承诺 因此,首先要做的是改变: function sample() { console.log("sam
这里有几个问题:
sampleX
函数不会返回任何内容sampleX
函数应该只返回承诺query
returnsfunction sample() {
console.log("sample called");
database.query("select * from sample").then(function(result){
sample = result;
}).catch(function(error){
console.log("error occured in sample")
});
}
致:
…同样,对于sample1
和sample2
如果按照问题中代码的建议,没有任何函数使用其他函数的结果,则您可以使用Promise。所有:
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");
}
这里有几个问题:
您的sampleX
函数不会返回任何内容
您的sampleX
函数应该只返回承诺query
returns
你在不必要地做出承诺
因此,首先要做的是改变:
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")
});
}
致:
…同样,对于sample1
和sample2
如果按照问题中代码的建议,没有任何函数使用其他函数的结果,则您可以使用Promise。所有:
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");
}
database.query()
似乎已经在返回一个承诺,所以当您可以返回承诺,并执行类似于sample().then(sample1.then(sample2.then)的操作时,这一切似乎都是毫无意义的(…
@adeneo我很感激你能多给我一点时间,因为我对这一切都很陌生。resolve
在javascript
atnewpromise(function(resolve,reject){})
在疑问中?嵌套的三个承诺调用三个函数()
不会返回已解决或被拒绝的承诺值或原因?数据库.query()
似乎已经在返回承诺,因此当您可以返回承诺并执行类似于sample()的操作时,这一切似乎都是毫无意义的。然后(sample1)。然后(sample2)。然后(…
@adeneo我很感激你能多给我一点时间,因为我对这一切都很陌生。resolve
在javascript
atnewpromise(function(resolve,reject){})
在疑问中?嵌套的三个承诺调用三个函数()
不会返回已解决或拒绝的承诺值或原因?它会抱怨承诺。但它不承认这一点keyword@aka:大小写在JavaScript中很重要:它是Promise.all
,而不是Promise.all
。我有相同的Promise.all。我完全复制了你发布的内容。@aka:你又说了Promise.all
。它是Promise.all
。小写a
。如果您使用的是ES2015(也称为“ES6”)promises(从v6开始内置到NodeJS中,可能更早),然后,Promise。所有的
都将是一个函数。如果你在使用其他东西,你应该提到。甚至=>这个符号没有识别它。我没有使用escma 6。请你建议我如何重写和使用新的Promise我需要写新的Promise吗。allit抱怨Promise。它都没有识别keyword@aka:Case在JavaScript中很重要:它是Promise.all
,而不是Promise.all
。我有相同的Promise.all。我完全复制了你发布的内容。@aka:你说的是Promise.all
。它是Promise.all
。小写的a
。如果你使用的是ES2015(aka“ES6”)promission(从v6开始内置到NodeJS,可能更早),然后Promise。所有的都将是一个函数。如果您正在使用其他东西,您应该提到这一点。甚至=>这个符号没有识别它。我没有使用escma 6。请您建议我如何重写和使用新的Promise。我需要编写新的Promise吗