express - node.js中的promise回调的写法问题
PHPz
PHPz 2017-04-17 15:25:08
0
3
652

请教正确的promise用法!!!

下面是错误的写法 最后没有return的结果就是 调用这个API函数拿不到promise

const apiFunction = () => {
    return Promise.resolve()
            .then(() => (demoResolve()))
            .then(() => (demoReject()))
    
            .then((data) => {
                // bug
                Promise.resolve(data);
            })
            .catch((err) => {
                // bug
                Promise.reject(err);
            });
};        

改进后下面这个promise方法能够如预期的拿到promise的值

const apiFunction = () => {
    return Promise.resolve()
            .then(() => (doResolve()))
            .then(() => (doReject()))
            // okay √
            .then((data) => Promise.resolve(data))
            // okay √
            .catch((err) => Promise.reject(err));
};
    

之后又尝试了一种写法,感觉这种写法和第一种写法没有什么区别,但是这样也写也是可以得到正确结果的。
请问这是什么情况呢?
这样写有错误吗?

const apiFunction = () => {
    return Promise.resolve()
            .then(() => (doResolve()))
            .then(() => (doReject()))
            .then(Promise.resolve)
            .catch(Promise.reject);
};

是不是等价于这种写法

const apiFunction = () => {
    return Promise.resolve()
            .then(() => (doResolve()))
            .then(() => (doReject()))
            .then(result)
            .catch(err);
};
PHPz
PHPz

学习是最好的投资!

全員に返信(3)
迷茫

1. ES6 を比較 => ES5 以降、最初の書き方と 2 番目の書き方の違いは主に Promise が返されるかどうかです

リーリー

3 番目のタイプと最初のタイプの違いは、返すかどうかです

いいねを押す +0
Peter_Zhu

最初の文言 AL. はどこから来たのですか

更新。

しまった、この質問を見て、確かに質問者さんの書き方が間違っていたので質問させていただきました。後でもう一度来たら、他の回答者がすべて正しい答えを言っていたので、気にしませんでしたが、今日は踏まれました。本当に悔しい思いをしています。


それでは、もう一度答えを教えましょう。

Promise の then を返す必要があります。これは、後で使用するための新しい Promise を生成するために使用されます。

匿名アロー関数が式を返す場合、デフォルトでそれを返します。

直接記述すると.then(Promise.resolve)、このメソッドはコールバックとして使用されますが、これはもちろん正しいです。 Promise.resolve

この書き方では、結果がどうなるか分かりません、質問に記載されていません。 .then(result)

つまり、 then は最後に返さなければなりません。これは、後続のチェーン呼び出しの新しい Promise を生成するために使用されます。

いいねを押す +0
阿神

最初の書き方は完全に間違っているわけではありません。then で新しい Promise オブジェクトを返さなかっただけです。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート