首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >纯JavaScript $.Deferred

纯JavaScript $.Deferred
EN

Stack Overflow用户
提问于 2017-09-13 17:17:23
回答 2查看 1.8K关注 0票数 0

如果没有jQuery,我将如何编写下面的内容?

代码语言:javascript
复制
var dfd = $.Deferred()
dfd.done(done)
dfd.resolve()

function done() {
   console.log('done')
}
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-13 17:31:23

代码语言:javascript
复制
    function Deferred (){
      let res,rej,p = new Promise((a,b)=>(res = a, rej = b));
      p.resolve = res;
      p.reject = rej;
      return p;
    }

你只需要公开决心和拒绝,才能让它发挥作用。

票数 3
EN

Stack Overflow用户

发布于 2020-07-24 03:53:22

使用本机承诺的问题在于回调中提供了解决和拒绝处理程序,因此如果您尝试在实际分配它们之前调用它们。

在我看来,仅仅实现延迟的自己会更加健壮,例如:

代码语言:javascript
复制
function deferred() {
  let thens = []
  let catches = []

  let status
  let resolvedValue
  let rejectedError

  return {
    resolve: value => {
      status = 'resolved'
      resolvedValue = value
      thens.forEach(t => t(value))
      thens = [] // Avoid memleaks.
    },
    reject: error => {
      status = 'rejected'
      rejectedError = error
      catches.forEach(c => c(error))
      catches = [] // Avoid memleaks.
    },
    then: cb => {
      if (status === 'resolved') {
        cb(resolvedValue)
      } else {
        thens.unshift(cb)
      }
    },
    catch: cb => {
      if (status === 'rejected') {
        cb(rejectedError)
      } else {
        catches.unshift(cb)
      }
    },
  }
}

const d = deferred()

setTimeout(() => {
  d.resolve('good')
}, 1000)

// Will be called after 1s
d.then(value => console.log('#1 resolved!', value))

setTimeout(() => {
  // Will be called after 3s and executed right away as it's already resolved
  d.then(value => console.log('#2 resolved!', value))
}, 3000)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46203393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档