我仍在为承诺而挣扎,但多亏了这里的社区,我取得了一些进步。
我有一个简单的JS函数,它查询解析数据库。它应该返回结果数组,但显然由于查询的异步性质(因此有承诺),函数在结果之前返回,给我留下一个未定义的数组。
我需要做什么才能让这个函数等待承诺的结果呢?
这是我的代码:
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");
}
});
}
不是返回resultsarray
,而是返回一个results数组的承诺,然后在调用站点上返回然后
-这有一个额外的好处,即调用方知道函数正在执行异步I/O。在JavaScript中编写并发代码的基础是--您可能需要阅读这个问题以获得更广泛的概念:
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自己的关于它的博客文章中看到更多使用解析承诺和查询的示例。
我需要做什么才能让这个函数等待承诺的结果呢?
使用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');
}
由于注释而添加:一个异步函数总是返回一个承诺,在TypeScript中,它看起来像:
async function waitForPromise(): Promise<string> {
// let result = await any Promise, like:
let result = await Promise.resolve('this is a sample promise');
}