2016-04-13 24 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

どの変数を保存しようとしていますか? 2番目の '.then() 'から返される値はありません – guest271314

+0

最初の返品にcustomer.idを、最後の返品にcharge.idを保存します。変数に結果を格納しようとする私の悲しい試みのため、2番目の関数は戻り値を持ちません。 –

+0

'Stripe.tokens.create({' call?)の外に 'customer.id'を格納しますか?' Stripe.tokens.create({'? – guest271314

答えて

0

Stripe方法もcustomer.id.then()から返された場合は、チェーン代わり

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 
 
});


.then()で、各.then()からアクセス値を値をreturnすることができます、charge.idは、Stripe方法および個々charge.idcustomer.idから返さ両方Promise値がcustomerTokensにチェーン.then()で利用できるようになり、アレイにStripe方法およびcustomer.idcharge.idによって返さ両方Promise値をプッシュ機能にStripe方法を渡すことができます。

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)) 
 
});


また、1つの.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

に対するBergiのMutable文脈の状態の答えを見ていますが、あなたのチェーンが約束を返すなら、これはどのように機能しますか? – mido

+0

@mido _ "あなたのチェーンが約束を返すなら、これはどのように機能しますか?" – guest271314

+0

チェーンの各ステップで値を返していますが、約束を返せば 'id'変数をどのように渡しますか? – mido

0

でフィルタ、すべての結果をPromise.all()を利用することができます醜い、まだ簡単な解決策は、(ちょっと)を使用してグローバル変数を次のようになります。

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({...});