[英]Javascript: write function that returns a promise
我正在嘗試在Firebase Functions中創建一個返回諾言(或同步返回,我不介意)的函數,但是沒有成功。
這是我編寫的函數:
function doSomethingLong(param) {
https.get('http://www.myurl.com?param=' + param, (resp) => {
let data = '';
// A chunk of data has been recieved.
resp.on('data', (chunk) => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
console.log("Call succeeded. Response: " + data);
return true;
});
}).on("error", (err) => {
console.log("Call failed. Error: " + err.message);
return false;
});
}
我想在Firebase發生某些更改時調用它,然后等待它完成,例如:
exports.someFunction = functions.database.ref('/users/{user_id}/param').onCreate(event => {
const param = event.data.val();
if (doSomethingLong(param)) {
console.log("ttt");
} else {
console.log("fff");
}
return null;
})
無論我如何嘗試, someFunction
函數都會在doSomethingLong
結束之前結束。
有什么線索嗎?
您必須創建一個Promise並在異步任務結束時解決/拒絕它。
function doSomethingLong(param) {
return new Promise(function(resolve, reject){
https.get('http://www.myurl.com?param=' + param, (resp) => {
let data = '';
// A chunk of data has been recieved.
resp.on('data', (chunk) => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
console.log("Call succeeded. Response: " + data);
resolve();
});
}).on("error", (err) => {
console.log("Call failed. Error: " + err.message);
reject(err);
});
});
}
現在您可以像這樣使用它
doSomethingLong()
.then(function() {
console.log(pased)
},
function(err) {
console.log(err)
}
)
做類似的事情,
function doSomethingLong(param) {
return new Promise(function(resolve,reject){
https.get('http://www.myurl.com?param=' + param, (resp) => {
let data = '';
// A chunk of data has been recieved.
resp.on('data', (chunk) => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
console.log("Call succeeded. Response: " + data);
resolve(data);//resolve data
});
}).on("error", (err) => {
console.log("Call failed. Error: " + err.message);
reject(err);//reject(reason)
});
});
}
exports.someFunction = functions.database.ref('/users/{user_id}/param').onCreate(event => {
const param = event.data.val();
if (addUserToNewsletter(user_id, name, email, language)) {
console.log("ttt");
} else {
console.log("fff");
}
return null;
let promise=doSomethingLong('foo');
promise.then((data)=>{
console.log(data);
}).catch((err)=>{
console.log(err);
})
})
您可以通過返回promise,promise.resolve或promise.reject來使它們同時加入。
使您的代碼看起來像這樣:
this.props.doSomethingLong(loginResult.credential)
.then(result => this.someFunction(result))
.catch(error => this.handleError(error.message))
這樣做:
exports.someFunction = functions.database.ref('/users/{user_id}/param').onCreate(event => {
const param = event.data.val();
if (addUserToNewsletter(user_id, name, email, language)) {
console.log("ttt");
} else {
console.log("fff");
}
return Promise.resolve();
})
進行每個函數調用,您都可以了解有關Promises及其在Node-js中的工作方式的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.