迭代正常的功能和承诺

时间:2017-02-19 08:46:00

标签: javascript es6-promise

Object.prototype.modify = function(modifications,prop){
  modifications.forEach(modifier => {
     this[prop] = modifier(this[prop])
  })
}

function removeLastName(str){
  return str.split(' ')[0]
}

function upperCase(str){
  return str.toUpperCase()
}

function translate(str){
  return new Promise((resolve,reject) => {
      setTimeout( _ => resolve(str+"translated"),1000)
  })
}

function prepareUser(user){
  user.modify([removeLastName,upperCase],'name')
  // user.modify([removeLastName,upperCase,trans],'name') 
  return user
}

var user = {
  name: "simon madsen"
}

console.log(prepareUser(user));

您好,我如何使用我的修改函数来使用返回promise的普通函数和函数。没有我所有的修改函数返回promises,并且没有我的修改函数来返回一个promise。

2 个答案:

答案 0 :(得分:1)

您可以尝试将所有同步功能转换为承诺并使用Promise.all,请参阅https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

return Promise.all(modifications.map(item => {
  if (item instanceof Promise){
    return item
  } else {
    return new Promise(function(resolve, reject) {
      try {
        resolve(item(prop))
      } catch (err) {
        reject(err)
      }
    })
  }
}))

// Then get the value after everything resolves
user.modify([removeLastName,upperCase,translate],'name')
  .then(function(results) {
    user.name = results.pop()
    console.log(user)
  })
  .catch(function(err) {
    console.log('Oops', err)
  })

答案 1 :(得分:0)

Object.prototype.modify = function(modifications,prop){

  var modificationsPromises = modifications.map(modifier => {
    return Promise.resolve(modifier(this[prop]))
    .then( modifiedProp => {
        this[prop] = modifiedProp
     })
  })
  return Promise.all(modificationsPromises).then( _ => Promise.resolve(this))

}

这是我的解决方案,感谢您的回复。