2016-04-13 87 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({...});