分享
三行代码  ›  专栏  ›  技术社区  ›  aomerk

在Promises中对不同的调用类型使用相同的函数

  •  -4
  • aomerk  · 技术社区  · 5 天前

    它们在以下方面有什么不同

    • 执行命令

    等。

      getFromURL().then(function () {
          return callbackFunc();
        });
        
        getFromURL().then(function () {
          callbackFunc();
        });
        
        getFromURL().then(callbackFunc());
        
        getFromURL().then(callbackFunc);
    
    2 回复  |  直到 5 天前
        1
  •  1
  •   jfriend00    5 天前

    他们返回的结果是一样的

    这是不对的。他们并不是都在做同样的事情。

    你的选择1和4是做事情的合理方法。你的选项2可能是错误的,尤其是在 callbackFunc() 回调函数() 返回一个您希望在承诺链中调用的函数,并且希望在此之前调用该函数 getFromURL() 解决(这两种情况都很少见)。

    回调函数() .then() 所以你可以看到返回值。

    那么,就这么说吧 回调函数() 返回“hello”。那你就在这儿。这两个是相同的:

    getFromURL().then(function () {
      return callbackFunc();
    }).then(result => {
      console.log(result);
    });
    
    getFromURL().then(callbackFunc).then(result => {
      console.log(result);
    });
    

    这两个函数都将记录调用的返回值 回调函数() 回调函数() 回调函数() 回调函数()


    这个总是记录 undefined :

    getFromURL().then(function () {
      callbackFunc();
    }).then(result => {
      console.log(result);
    });
    

    因为第一个没有返回值 。然后() 处理程序。 调用的顺序与前两个相同,但由于您没有从 。然后() 处理程序,它是孤立的并与承诺链分离,并且承诺链具有 解析值。

    如果 是异步的,那么这可能是错误的,因为 回调函数() 不是承诺链的一部分,而且由于您没有从

    如果 回调函数() 是同步的,你不关心它的返回值,那么这只是序列 之后 getFromURL() 像前两个选项一样进行解析,只是忽略了返回值。


    这个和其他的最不一样:

    getFromURL().then(callbackFunc()).then(result => {
        console.log(result);
    });
    

    回调函数() getFromURL() 决心。它的返回值将传递给 。然后() . 除非返回值是函数引用,否则承诺链将完全忽略它。

        2
  •  0
  •   Klaycon    5 天前
    getFromURL().then(function () {
      return callbackFunc();
    });
    

    此语句返回一个Promise,它将使用返回的值进行解析 callbackFunc() callbackFunc 返回一个承诺)。这是一种常见的模式。


    getFromURL().then(function () {
      callbackFunc();
    });
    

    此语句返回一个以未定义的方式解析的承诺。如果 回调函数() 是异步的,外部承诺解决之前 完成。这通常是不可取的。


    getFromURL().then(callbackFunc());
    

    此语句调用 回调函数() .then() . 结果未定义。看不见就不知道它会做什么 . 可能会导致错误。


    getFromURL().then(callbackFunc);
    

    回调函数()

    一般来说,#1和#4是您想要使用的。#2和3不是草率就是错误。