[英]Pass variable down through promise chain
我对承诺有点陌生,所以请原谅我缺乏知识。 下面的代码突出显示了我想做的事情,但显然我做不到。
var token = "";
var id = "";
var cms = {
login: function () {
return request({
"method": "POST",
"uri": process.env.CMS_URL + "/cms/login",
"json": true,
"body": {
"email": "xxxxxxx",
"password": "xxxxx"
}
}).then(response => {
console.log("Successfully logged in to cms. Access token: " + response);
token = response;
}).catch(error => {
console.log("Couldn't get access token from cms");
});
},
createCollection: function (token) {
return request({
"method": "POST",
"uri": process.env.CMS_URL + "/cms/collection",
"json": true,
"headers": {
"X-Cms-Token": token
},
"body": {
"name": "Acceptance test collection",
"type": "manual"
}
}).then(response => {
console.log("Successfully created a collection.");
id = response.id;
}).catch(error => {
console.log("Collection already exists");
});
},
deleteCollection: function (token, id) {
return request({
"method": "DELETE",
"uri": process.env.CMS_URL + "/cms/collection" + id,
"json": true,
"headers": {
"X-Cms-Token": token
}
}).then(response => {
console.log("Successfully deleted collection.");
}).catch(error => {
console.log("No collection to delete");
console.log(error);
});
}
};
var createCollectionCms = function (token, id) {
return new Promise((resolve) => {
cms.login()
.then(zebedee.createCollection(token))
.then(zebedee.deleteCollection(token, id));
setTimeout(resolve, 6000);
});
}
createCollectionCms();
我需要运行每个函数并传入“token”和“id”。 通过这样做,每个函数同时运行。 我需要它们相互执行,但传递所需的变量。
基本上我需要登录,创建一个“收藏”,删除“收藏”。 这是我正在设置的一些测试的一部分。
这是使用async/await使用 Promises 的可读且看起来同步的替代方案(实际上仍然在幕后使用 Promises)
// returns a Promise whose response is the token
const requestAccessToken = cmsUrl => request(/* request options with cmsUrl */)
// returns a Promise whose response is the collectionId
const createCollection = token => request(/* request options with token */)
// returns a Promise whose response is given by deleting the respective collection
const deleteCollection = collectionId => request(/* request options with collectionId */)
// create and execute an async function that puts all these functions together in a synchronous manner
const createThenDeleteCollection = async cmsUrl => {
try { // if at any time an error is thrown, the error is caught and logged
const token = await requestAccessToken(cmsUrl)
const collectionId = await createCollection(token)
const responseFromDeletingCollection = await deleteCollection(collectionId)
console.log(responseFromDeletingCollection)
} catch (err) {
console.error(err)
}
}
createThenDeleteCollection(process.env.CMS_URL)
使用此方法的一个警告是,如果您在浏览器中执行它,则 IE 不支持它,如果您在 Node 中执行,则至少需要使用 7.6 版
这里有一个简单的例子,展示了如何通过承诺链传递值。
const one = () => new Promise((resolve) => {
return resolve(1)
});
const two = (val) => new Promise((resolve) => {
return resolve(val * 5);
})
const three = (val, val2) => new Promise((resolve) => {
return resolve(val + val2);
})
one().then((r) => {
//r is 1
console.log('r is 1:', r)
return r
})
//we pass the return value from the previous to the two function
.then(two)
.then((r) => {
//r is 1 * 5
console.log('r is 1 * 5:', r)
return three(r, 10)
})
.then((r) => {
//r is now 5 + 10
console.log('r is now 5 + 10:', r)
})
如果您需要传递多个值,请使用数组或对象。 https://jsfiddle.net/rfk2Lxku/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.