如何在返回函数变量之前等待Promise完成?

IT技术 javascript parse-platform promise
2021-03-07 02:02:03

我仍在为Promise而苦苦挣扎,但由于这里的社区,我取得了一些进展。

我有一个简单的 JS 函数来查询 Parse 数据库。它应该返回结果数组,但显然由于查询的异步性质(因此是Promise),该函数在结果之前返回,给我留下一个未定义的数组。

我需要做什么才能让这个函数等待 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");
               }
    });                           

}
4个回答

而不是返回一个resultsArray结果数组,然后then在调用站点上返回一个Promise- 这具有调用者知道该函数正在执行异步 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 自己的关于它的博客文章中看到更多使用 parse promise 和查询的示例

啊所以这不仅仅是纯javascript?我正在寻找一种方法来做到这一点(等待一个函数完成以启动另一个函数)但只能使用纯 javascript..
2021-04-23 02:02:03
问题是关于解析代码,而不是Promise。Promises 可以在任何浏览器中工作(使用库)。Bluebird 在 IE6 和 netscape 7 中运行。
2021-04-23 02:02:03
我已经读了两天了,但仍然没有人解决这个问题。这个接受的答案与其他答案相同。该函数返回一个 Promise,而不是 OP 请求的值。为什么这个答案被标记为已接受?
2021-04-26 02:02:03
你能告诉我这有什么支持吗?IE9 支持这个吗?
2021-04-28 02:02:03
是的,但 Parse 本身大部分时间都死了,所以有@SandrinaPereira。这是解析代码。
2021-04-28 02:02:03

我需要做什么才能让这个函数等待 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');
    }

由于评论而添加:异步函数总是返回一个 Promise,在 TypeScript 中它看起来像:

    async function waitForPromise(): Promise<string> {
        // let result = await any Promise, like:
        let result = await Promise.resolve('this is a sample promise');
    }
@TamusJRoyce Guess 这本身就是一个问题,但我认为在 C# 中你可以使用 Task.ContinueWith(Task),这与你在接受的答案中看到的想法相同(它被称为 "then()" )。
2021-04-24 02:02:03
我想我现在看到了。我几乎可以将整个脚本包装在一个巨大的异步函数中。并将该函数称为脚本的最后一行。该功能仍然是一点点样板。但比我以前想象的要少得多。我不习惯在函数中编写函数。谢谢@MartinMeeser!
2021-04-29 02:02:03
如果在没有等待的情况下调用(或在非异步代码中),异步函数仍将返回一个Promise对象。如果不确定,请检查 console.log(waitForPromise()) 的结果。在 async 函数中检查 console.log(result)打印出您期望的内容,但是 async 函数的返回会立即发生而不会阻塞并返回一个Promise。在 javascript 中阻塞通常是非常糟糕的,因为它是一个单线程应用程序,阻塞将使任何其他发布/订阅通知客户端饿死,基本上使整个应用程序陷入困境。
2021-05-01 02:02:03
@SRM 我觉得你的评论是基于对样本的误解 - 它是关于“内部” Promise.resolve (作为最简单的 Promise 示例),所以没有你在评论中陈述的外部调用者。所以我决定更新答案。
2021-05-06 02:02:03
.net 在“Promise”之类的任务类上有 .wait() 。Javascript 是否缺少此功能?在退出我的节点命令行工具之前,我需要等待一些东西,该工具可能会将其输出传送到另一个工具。“await”仅在异步函数内有效。这意味着它在Promise的范围之外不起作用。
2021-05-16 02:02:03

您实际上并没有在这里使用Promise。Parse 允许您使用回调或Promise;你的选择。

要使用 Promise,请执行以下操作:

query.find().then(function() {
    console.log("success!");
}, function() {
    console.log("error");
});

现在,要在Promise完成后执行内容,您可以在调用内的Promise回调中执行它then()到目前为止,这与常规回调完全相同。

真正善用 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");
});
结果对象是什么类型的对象?因为它似乎不包含我的数组
2021-04-18 02:02:03
它应该是Parse.Object's的数组
2021-04-30 02:02:03

你不想让函数等待,因为 JavaScript 是非阻塞的。而是在函数的末尾返回Promise,然后调用函数可以使用Promise来获取服务器响应。

var promise = query.find(); 
return promise; 

//Or return query.find(); 
我试过了,但结果似乎未定义。resultsByName("name").then(function(results){ console.log("got array "+results.count); });
2021-04-25 02:02:03
你的整个回调事情success:都关了。
2021-04-30 02:02:03
也可以。我只是为了说明目的而将其保留为这样,但将其添加为评论。
2021-05-02 02:02:03
或者更好:return query.find();
2021-05-08 02:02:03
谢谢,结果函数中一定有某种错误。它现在正在工作。我将 console.log 更改为 results.length,可以看到返回的数组中有 1 个条目:)
2021-05-14 02:02:03