繁体   English   中英

通过承诺链向下传递变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM