2016-04-30 94 views
1

我有func1函數返回承諾。在func2我已經開始承諾鏈。 我想在這裏做的是,我想在舊承諾鏈中使用func1解析消息,並且我希望此代碼不那麼複雜。什麼是加盟func1承諾通過增加一個額外的步驟,以老許鏈答應鏈func2如何加入對承諾鏈的承諾

var func1 = function(){ 
    return new promise(function(resolve, reject){ 
    //some operations here 
    }); 
}; 

var func2 = function(){ 
    promise.resolve(someFuncSync()) 
    .then(function(){ 
    //this is the old promise chain 

     func1() 
      .then(function(message,error){ 
      return message; 
      //i want use this return value in old promise chain 
      }); 

     console.log(message); 
     //printing func1 returned message in old promise chain 
    }) 
}; 
+0

你不能做到這一點,你可以訪問只在'then' func1中發送消息。 – Grundy

+0

@JonathanLonowski你應該發佈它作爲答案。只需使用'then(function(message){console.log(message)})'。 – dfsq

+0

「鏈」是什麼意思?序列?你想分別用func1和func2的解析值做什麼? –

回答

0

我會做到這一點的最好辦法。

這裏假設您不需要使用新舊承諾鏈中解析的值。

var func1 = function(){ 
    return new promise(function(resolve, reject){ 
    //some operations here 
    }); 
}; 

var func2 = function(){ 
    promise.resolve(someFuncSync()) 
    .then(function(arg){ 

     return promise.all([ 
      arg, // Argument that original promise resolved with 
      func1() // The new extra promise 
     ]) 
    }) 
    .spread(function(arg, message){ 
     // Now i have the new message and also the return value from the old promise. 
     console.log(message); 
     //printing func1 returned message in old promise chain 
    }) 
}; 
1

,只需從.then()處理程序中返回新的承諾,它會自動被添加到前面的鏈中,然後將控制老許鏈的解析值。

只有在新返回的承諾解決且內部承諾將控制最終解決的值之後,外部承諾才能解決。我在這裏添加了return聲明呼叫前面return func1()將其添加到鏈:

var func2 = function(){ 
    promise.resolve(someFuncSync()) 
    .then(function(){ 
    //this is the old promise chain 

     // ADDED return here 
     return func1() 
      .then(function(message,error){ 
      return message; 
      //i want use this return value in old promise chain 
      }); 
    }) 
}; 

還有其他幾件事情我會在你的代碼改變,因爲它看起來像一切你有以上可蒸餾下降到只有這個:

var func2 = function() { 
    someFuncSync(); 
    return func1(); 
}; 

這允許你這樣做然後做:

func2().then(function(message) { 
    // process message here 
}, function(err) { 
    // process err here 
}); 

變更摘要:

  1. 沒有必要包裝someFuncSync()成承諾,如果它總是同步的。你可以打電話給它,然後開始你的承諾鏈。
  2. 由於標準的承諾,只返回一個值(不是像(message, error),實在沒有理由在這return message回調。您只需直接返回的承諾。
  3. 新增returnfunc1()前面,所以我們正在迴歸。承諾
+0

@ doug65536 - 作品這裏非常好:https://jsfiddle.net/jfriend00/pxbLvz2w/ – jfriend00

+0

是的,你說得對。如果在該行上有'return'後沒有更多的文本,'return'將只是一個可能的ASI問題。 – doug65536

+0

就個人而言,我始終把第一'。那麼()'在同一行上一個函數調用,因爲我認爲,閱讀更清晰,有更多的驚喜 - 這個特殊的方案是使用OP這裏發生了什麼。 – jfriend00

1

人,有些答案真的東西得太多承諾的優點是其簡單:

return func1().then(func2)