2016-04-13 34 views
-1

我想檢索下面一系列承諾的結果並將其存儲到變量中,以便我可以在此鏈之外使用它。這就是說,我一直在得到錯誤或變量出來未定義。Javascript承諾 - 檢索結果

這裏的系列:

我已經試過存放在變量VAR即= customerToken下面的代碼//的承諾。但是,customerToken是未定義的,因爲承諾在變量設置後結束。

var Stripe = StripeAPI('sk_test_key'); 

Stripe.customers.create({ 
    email: Meteor.user().emails[0].address, 
    description: "SIDIM 2016", 
    source: stripeToken 
}).then(function(customer) { 

    return Stripe.tokens.create({ 
    customer: customer.id 
    }, {stripe_account: "acct_XXXYYYZZZ"}); 

}).then(function(token) { 

    console.log(token); 

    var charge = Stripe.customers.create({ 
    email: Meteor.user().emails[0].address, 
    description: "SIDIM 2016", 
    source: token.id 
    }, {stripe_account: "acct_XXXYYYZZZ"}); 

    console.log(charge); 

}).then(function(charge) { 

    return Stripe.charges.create({ 
    amount: total, 
    currency: 'usd', 
    customer: charge.id 
    }, {stripe_account: "acct_XXXYYYZZZ"}); 

}).catch(function(err) { 
    // Deal with an error 
}); 
+2

你試圖存儲哪個變量?沒有值從第二個'.then()' – guest271314

+0

返回。我想將customer.id存儲在第一個返回中,並將charge.id存儲在最後一箇中。第二個沒有回報,因爲我悲傷地試圖將結果存儲在變量中。 –

+0

您是否想在'Stripe.tokens.create({'call?')之外存儲'customer.id',或者在'Stripe.tokens.create({'? – guest271314

回答

0

您可以從每個.then().then()鏈後return值,訪問值

var customerTokens = Promise.resolve() 
 
.then(function() { 
 
    // do stuff 
 
    var customerId = 1; 
 
    return customerId; // return `customerId` here 
 
}) 
 
.then(function(id) { 
 
    // do stuff 
 
    return id // return `id` : `customerId` here 
 
}) 
 
.then(function(id) { 
 
    // do stuff 
 
    var chargeId = 2; 
 
    return [id, chargeId]; // return both `customerId`:`id` and `chargeId` 
 
}) 
 
.catch(function(err) { 
 

 
}); 
 

 
customerTokens 
 
.then(function(ids) { 
 
    console.log(ids) // access `customerId`, `chargeId` here 
 
});


另外,如果Stripe方法也從.then()customer.id返回,charge.id,你可以通過Stripe方法是推動通過Stripe方法和customer.idcharge.id到陣列,其中兩個Promise值從Stripe方法和個別charge.idcustomer.id返回將可在.then()customerTokens返回兩者Promise值的函數。

var arr = [ 
 
    [], 
 
    [] 
 
]; 
 

 
var Stripe = function(val) { 
 
    return new Promise(function(resolve) { 
 
    var d = Math.random() * 3000; 
 
    setTimeout(function() { 
 
     arr[0].push({ 
 
     StripeData: d // `Stripe` method data 
 
     }); 
 
     if (val) { 
 
     arr[1].push(val) 
 
     } 
 
     resolve(arr) 
 
    }, d) 
 
    }) 
 
} 
 

 
var customerTokens = Promise.resolve() 
 
.then(function() { 
 
    // do stuff 
 
    var customerId = 1; 
 
    return Stripe({ 
 
     customerId: customerId 
 
    }); // pass `customerId` here 
 
}) 
 
.then(function(id) { 
 

 
    // do stuff 
 
    return Stripe() // 
 
}) 
 
.then(function(id) { 
 
    // do stuff 
 
    var chargeId = 2; 
 
    return Stripe({ 
 
     chargeId: chargeId 
 
    }); // pass `customerId` 
 
}) 
 
.catch(function(err) { 
 

 
}); 
 

 
customerTokens 
 
.then(function(data) { 
 
    var ids = data[1]; 
 
    // access `customerId`, `chargeId` here at `data[1]` 
 
    console.log("complete", data, JSON.stringify(ids)) 
 
});


你也可以利用Promise.all(),在單.then()

var arr = [ 
 
    [], 
 
    [] 
 
]; 
 

 
var Stripe = function(val) { 
 
    return new Promise(function(resolve) { 
 
    var d = Math.random() * 3000; 
 
    setTimeout(function() { 
 
     arr[0].push({ 
 
     StripeData: d // `Stripe` method data 
 
     }); 
 
     if (val) { 
 
     arr[1].push(val) 
 
     } 
 
     resolve(arr) 
 
    }, d) 
 
    }) 
 
} 
 

 
var customerTokens = Promise.all([Stripe({ 
 
     customerId: Math.random() * 10 
 
    }), Stripe(), Stripe({ 
 
     chargeId: Math.random() * 5 
 
    }).then(function(data) { 
 
    // do stuff 
 
    console.log(data); 
 
    return data // return data 
 
})]) 
 

 
.catch(function(err) { 
 

 
}); 
 

 
customerTokens 
 
.then(function(data) { 
 
    data.forEach(function(response, index) { 
 
     response[1].forEach(function(ids) { 
 
     console.log(ids) // filter `customerId`, `chargeId` 
 
     }) 
 
    }) 
 
});

+0

,但如果您的鏈條返回承諾,這將如何工作? – mido

+0

@mido _「但如果你的鏈條返回一個承諾,這將如何工作?」_不遵循? – guest271314

+0

您在鏈的每一步都會返回值,如果您返回承諾,您將如何傳遞'id'變量? – mido

0

的過濾所有結果醜陋而簡單的解決辦法是使用(有點)全局變量:

var customerId; 

Stripe.customers.create({...}).then(function(customer){ 
    customerId = customer.id; 
    ... 

一個更優雅的方式是使用情境,並把它作爲這個屬性throught承諾鏈:

function getExample() { 
    var ctx = {}; 
    return promiseA(…) 
    .then(function(resultA) { 
     this.resultA = resultA; 
     // some processing 
     return promiseB(…); 
    }.bind(ctx)).then(function(resultB) { 
     // more processing 
     return // something using both this.resultA and resultB 
    }.bind(ctx)); 
} 

讀這個解決方案在Bergi's answer

最好的方式做到這一點的詳細信息可能會使用async promises,但你可能要等到ES7:

var customer = await Stripe.customers.create({...});