在返回函数变量之前如何等待承诺完成?
How do I wait for a promise to finish before returning the variable of a function?
我仍在为承诺而苦苦挣扎,但感谢这里的社区,我取得了一些进步。
我有一个查询 Parse 数据库的简单 JS 函数。它应该 return 结果数组,但显然由于查询的异步性质(因此承诺),函数 returns 在结果之前,给我留下了一个未定义的数组。
我需要怎么做才能让这个函数等待promise的结果?
这是我的代码:
function resultsByName(name)
{
var Card = Parse.Object.extend("Card");
var query = new Parse.Query(Card);
query.equalTo("name", name.toString());
var resultsArray = [];
var promise = query.find({
success: function(results) {
// results is an array of Parse.Object.
console.log(results);
//resultsArray = results;
return results;
},
error: function(error) {
// error is an instance of Parse.Error.
console.log("Error");
}
});
}
您不想让函数等待,因为 JavaScript 是非阻塞的。
而是 return 函数末尾的承诺,然后调用函数可以使用承诺来获取服务器响应。
var promise = query.find();
return promise;
//Or return query.find();
而不是 returning resultsArray
你 return 对结果数组的承诺,然后 then
在调用站点上的承诺 - 这有额外的好处调用者知道该函数正在执行异步 I/O。 JavaScript 中的编码并发性基于此 - 您可能想阅读 this question 以获得更广泛的想法:
function resultsByName(name)
{
var Card = Parse.Object.extend("Card");
var query = new Parse.Query(Card);
query.equalTo("name", name.toString());
var resultsArray = [];
return query.find({});
}
// later
resultsByName("Some Name").then(function(results){
// access results here by chaining to the returned promise
});
中看到更多关于在查询中使用解析承诺的示例
你实际上并没有在这里使用承诺。 Parse 允许您使用回调或承诺;你的选择。
要使用承诺,请执行以下操作:
query.find().then(function() {
console.log("success!");
}, function() {
console.log("error");
});
现在,要在 promise 完成后执行某些操作,您只需在 then()
调用的 promise 回调中执行即可。到目前为止,这与常规回调完全相同。
真正利用好 promise 是将它们链接起来,就像这样:
query.find().then(function() {
console.log("success!");
return new Parse.Query(Obj).get("sOmE_oBjEcT");
}, function() {
console.log("error");
}).then(function() {
console.log("success on second callback!");
}, function() {
console.log("error on second callback");
});
What do I need to do to make this function wait for the result of the promise?
使用 async/await
(不是 ECMA6 的一部分,但是
自 2017 年底起可用于 Chrome、Edge、Firefox 和 Safari,请参阅 canIuse)
MDN
async function waitForPromise() {
// let result = await any Promise, like:
let result = await Promise.resolve('this is a sample promise');
}
根据评论添加:
异步函数总是 returns 一个 Promise,在 TypeScript 中它看起来像:
async function waitForPromise(): Promise<string> {
// let result = await any Promise, like:
let result = await Promise.resolve('this is a sample promise');
}
我仍在为承诺而苦苦挣扎,但感谢这里的社区,我取得了一些进步。
我有一个查询 Parse 数据库的简单 JS 函数。它应该 return 结果数组,但显然由于查询的异步性质(因此承诺),函数 returns 在结果之前,给我留下了一个未定义的数组。
我需要怎么做才能让这个函数等待promise的结果?
这是我的代码:
function resultsByName(name)
{
var Card = Parse.Object.extend("Card");
var query = new Parse.Query(Card);
query.equalTo("name", name.toString());
var resultsArray = [];
var promise = query.find({
success: function(results) {
// results is an array of Parse.Object.
console.log(results);
//resultsArray = results;
return results;
},
error: function(error) {
// error is an instance of Parse.Error.
console.log("Error");
}
});
}
您不想让函数等待,因为 JavaScript 是非阻塞的。 而是 return 函数末尾的承诺,然后调用函数可以使用承诺来获取服务器响应。
var promise = query.find();
return promise;
//Or return query.find();
而不是 returning resultsArray
你 return 对结果数组的承诺,然后 then
在调用站点上的承诺 - 这有额外的好处调用者知道该函数正在执行异步 I/O。 JavaScript 中的编码并发性基于此 - 您可能想阅读 this question 以获得更广泛的想法:
function resultsByName(name)
{
var Card = Parse.Object.extend("Card");
var query = new Parse.Query(Card);
query.equalTo("name", name.toString());
var resultsArray = [];
return query.find({});
}
// later
resultsByName("Some Name").then(function(results){
// access results here by chaining to the returned promise
});
中看到更多关于在查询中使用解析承诺的示例
你实际上并没有在这里使用承诺。 Parse 允许您使用回调或承诺;你的选择。
要使用承诺,请执行以下操作:
query.find().then(function() {
console.log("success!");
}, function() {
console.log("error");
});
现在,要在 promise 完成后执行某些操作,您只需在 then()
调用的 promise 回调中执行即可。到目前为止,这与常规回调完全相同。
真正利用好 promise 是将它们链接起来,就像这样:
query.find().then(function() {
console.log("success!");
return new Parse.Query(Obj).get("sOmE_oBjEcT");
}, function() {
console.log("error");
}).then(function() {
console.log("success on second callback!");
}, function() {
console.log("error on second callback");
});
What do I need to do to make this function wait for the result of the promise?
使用 async/await
(不是 ECMA6 的一部分,但是
自 2017 年底起可用于 Chrome、Edge、Firefox 和 Safari,请参阅 canIuse)
MDN
async function waitForPromise() {
// let result = await any Promise, like:
let result = await Promise.resolve('this is a sample promise');
}
根据评论添加: 异步函数总是 returns 一个 Promise,在 TypeScript 中它看起来像:
async function waitForPromise(): Promise<string> {
// let result = await any Promise, like:
let result = await Promise.resolve('this is a sample promise');
}