2017-08-13 62 views
1
postPersonalDetails(pdData){ 
let options : RequestOptionsArgs; 
let token:string; 
let id:string; 
this.getToken().then((val) => { 
    token = val; 
    console.log("I am in token func"+token); 
}); 
this.storage.get('userID').then((val) => { 
    id = val; 
    console.log(val); 
}); 
console.log("I amhere"+token+id); 

我得到在第一consoleLog和第二Consolelog數據異步打字稿到同步打字原稿

由於異步性質第三控制檯日誌的正在打印第一 那裏通過我得到令牌是未定義和用戶ID是undefined 這樣做的正確方法是什麼?

+1

使用[異步/等待](https://basarat.gitbooks.io/typescript/content/docs/async- await.html)。或者您可以使用Promise.all方法 –

+0

我正在使用Ionic3/Angular 4/typescript。我得到編譯錯誤與異步/等待 – vivek

+0

@vivek https://www.youtube.com/watch?v=s6SH72uAn3Q - 承諾所有的例子出現在12:14 ..有一個JsFiddle的一部分代碼之前有點那.. http://jsfiddle.net/jspatel/mkjh2ev5/ – JGFMK

回答

3

角度設置附帶core-jsPromise的填充。您可以將您的承諾與Promise.allsee MDN with a detailed method explanation)合併,然後在兩個承諾解決後繼續。

Promise.all([ 
    promise1, promise2, ... 
]) 

請記住,如果合併的承諾之一被拒絕,Promise.all拒絕。

0

下面是關於PerfectPixel提出的更多細節。

const promise1 = this.getToken().then((val) => { 
    console.log("I am in token func"+val); 
    return val; 
}); 

const promise2 = this.storage.get('userID').then((val) => { 
    console.log(val); 
    return val; 
}); 

Promise 
    .all([promise1, promise2]) 
    .then((results) => { 
    const [ token, id ] = results; 
    console.log("I am here"+token+id); 
    }); 
} 

這是一個更通用的例子。 (見BERGI的評論關於副作用的更多細節。)

const promise1 = Promise.resolve("the-token").then((val) => { 
 
    console.log("I am in token func: " + val); 
 
    return val; 
 
}); 
 

 
const promise2 = Promise.resolve("the-userID").then((val) => { 
 
    console.log("I am in id func: " + val); 
 
    return val; 
 
}); 
 

 
Promise.all([promise1, promise2]).then((results) => { 
 
    const [ token, id ] = results; 
 
    console.log("I am here: " + token + " " + id); 
 
});

+0

不要使用這些全局變量。請。 – Bergi

+0

@Bergi好點。對答案的編輯是否足以緩解這種擔憂? –

+0

不會。他們仍然是自由變量(在使用它們的回調中)在任意點初始化。根本不要使用變量 - 使用promise結果值! – Bergi