如何在 Promise 中返回结果?

8

我正在自学JavaScript并且在处理promise内部的函数返回值时遇到了麻烦。我的代码大致是这样的:

foobar = function(x,y){
    //code that doesn't matter
    return promiseFunction(
        function(results){
           console.log("promise completed")
           console.log(output)
           return output;}
        function(err){throw error;});

console.log(foobar('1','2'));

这会打印出

这段文本。

undefined
promise completed
what I want the result to be

我刚接触异步编程,不确定自己做错了什么。

2个回答

7

在一个promise中,不要使用return关键字。而是要在它完成后链接另一个任务 - 获取一个新的promise来完成这个链接的任务:

function foobar(x,y){
    // Assuming that promiseFunction does return a promise
    return promiseFunction().then(function(results){
         console.log("promise completed")
         console.log(output)
         return output;
    }, function(err) {
         throw error;
    });
}
foobar('1','2').then(function(output) {
    console.log(output);
})

如果 promiseFunction 还没有返回一个 promise,请查看 Q文档中的这一部分,其中提供了一些构造 promises 的示例和模式。请注意,不要改动 HTML 标签。

如果我调用foobar('1','2').then...,我会得到“TypeError:Cannot call method 'then' of undefined”。这可能意味着foobar('1','2')没有返回一个promise?看起来在$ .ajax()中包装promiseFunction() ...应该可以解决这个问题。如何将jQuery添加到仅JavaScript文件中?没有HTML文件。 - DazedAndConfused
好的,我发布的函数确实会return一个promise。promiseFunction是否返回$.ajax的结果?如果您还没有使用jQuery,最好使用其他库。您如何在没有HTML的情况下执行脚本?在这种环境中可能有某种形式的importrequire - Bergi

6
异步函数不会返回值(或者说至少不可靠)。当你从异步函数获取值时,console.log已经使用了它所拥有的内容(在这种情况下是什么也没有或者是undefined)。当我刚开始接触时,我就学习了这个教训。如果你想要在异步函数后发生某些事情,你必须在异步函数内部调用它。
有关更多信息和建议,请参见线程如何从AJAX调用中返回响应?

1
所以 foobar('1','2') 返回了输出,但是 console.log 在 foobar('1','2') 有机会返回之前打印了 'undefined'? - DazedAndConfused
@user1231120 - 没错! - Dissident Rage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接