2016-08-20 54 views
0

我們如何定義等待承諾返回的NavigationInstruction?定義一個等待承諾返回的導航指令

let loginRedirectRoute: RouteConfig = { 
    name: "openIdRedirectRoute", 
    navigationStrategy: (instruction: NavigationInstruction) => { 
     this.loginRedirectHandler().then(() => { 
      instruction.config.moduleId = openIdConfiguration.LoginRedirectModuleId; 
     }).catch((err) => { 
      console.error(err.message); 
     }); 
    }, 
    route: this.getPath(openIdConfiguration.UserManagerSettings.redirect_uri), 
}; 

上述不起作用。它只在我們同步調用instruction.config.moduleId ...時纔有效。

換句話說,我們需要一個導航策略,在承諾返回後做一些事情。

這可能嗎?怎麼樣?

回答

2

你的內在功能沒有返回一個承諾。嘗試

this.loginRedirectHandler().then(() => { 
    return instruction.config.moduleId = openIdConfiguration.LoginRedirectModuleId; 
}).catch((err) => { 
    console.error(err.message); 
}); 

記住

  • .then(() => { return do_this(); })鏈的承諾,
  • .then(() => do_this());鏈的承諾,
  • .then(() => { do_this(); })沒有。

var foo = 0; 
 

 
function do_this(bar) { 
 
    console.log("call " + foo + " passed " + bar); 
 
    foo++; 
 
    bar++; 
 
    return bar; 
 
} 
 

 
var promise = new Promise(function(resolve, reject) { 
 
    window.setTimeout(() => { 
 
    resolve(0); 
 
    }, 500); 
 
}); 
 

 
promise 
 
    .then((bar) => { return do_this(bar); }) /* 1 */ 
 
    .then((bar) => do_this(bar)) /* 2 */ 
 
    .then((bar) => { do_this(bar); }) /* 3 */ 
 
    .then((bar) => do_this(bar)); /* undefined */

+0

的代碼可以使用兩種'{do_this(); }'和'do_this()'。爲什麼這兩個工作?在這個特定的例子中,鏈接一個沒有必要的承諾? –

+1

延遲響應... 如果下一步不需要前一個Promise的結果,則內部方法不返回Promise並不重要。它只是意味着下一步將立即執行,而不用等待先前的Promise解決。 – JSobell