我是承诺的新手。 我正在使用Bluebird的承诺以这种方式运行异步函数。
var contract_creation = function creation(contractName){
return new Promise(function (resolve,reject){
web3.eth.sendTransaction(
{
from: web3.eth.accounts[0],
data:contractsJSON[contractName].bytecode,
gas:gasprice
},
function(err, transactionHash){
if(err){
reject(err);
}else{
resolve(transactionHash);
}
}
);
});
}
var getCreatedContract = function getReceipt(name){
contract_creation(name)
.then(function(transactionHash){
return web3.eth.getTransactionReceipt(transactionHash);
});
}
getCreatedContract("Fund").then(function(receipt){
console.log(receipt);
});
sendTransaction是一种需要时间的异步操作。
运行后我得到了这个例外。
getCreatedContract("Fund").then(function(receipt){
^
TypeError: Cannot read property 'then' of undefined
我不能从.then()返回一些内容,这也是一个承诺。从promise函数返回值的正确方法是什么?
答案 0 :(得分:3)
你确实可以在then
内返回一个Promise来将执行传递给另一个异步操作......
每当你想要这样做时,你必须返回Promise。在这里,这意味着返回在getCreatedContract
中创建的Promise:
var getCreatedContract = function getReceipt(name){
return contract_creation(name)
// ^^^^^^
.then(function(transactionHash){
return web3.eth.getTransactionReceipt(transactionHash);
});
}
答案 1 :(得分:1)
sdgluck 为您提供了答案,但您可以更多地改进您的代码,您正在使用Bluebird,因此您可以宣传sendTransaction()
:
var Promise = require('bluebird');
var contract_creation = function creation(contractName) {
// if you need this promisified function elsewhere, you can declare it globally
var sendTransactionAsync = Promise.promisify(web3.eth.sendTransaction);
return sendTransactionAsync({
from: web3.eth.accounts[0],
data: contractsJSON[contractName].bytecode,
gas: gasprice
});
}
var getCreatedContract = function getReceipt(name) {
return contract_creation(name)
.then(web3.eth.getTransactionReceipt); // << no need to wrap the function inside another function
}
getCreatedContract("Fund").then(function (receipt) {
console.log(receipt);
});