te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>javascript - When should I reject a promise? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - When should I reject a promise? - Stack Overflow

programmeradmin4浏览0评论

I'm writing some JS code that uses promises. For example, I open a form pop-up and I return a jQuery Deferred object. It works like this:

  • If the user clicks OK on the form, and it validates, the Deferred resolves to an object representing the form data.

  • If the user clicks Cancel, then the Deferred resolves to a null.

What I'm trying to decide is should the Deferred instead reject, instead of resolve? More generally, I'm wondering when should I resolve to something like a null object, and when should I reject?

Here's some code demonstrating the two positions:

// Resolve with null.
var promise = form.open()
    .done(function (result) {
        if (result) {
            // Do something with result.
        } else {
            // Log lack of result.
        }
    });

// Reject.
var promise = form.open()
    .done(function (result) {            
        // Do something with result.            
    })
    .fail(function () {
        // Log lack of result.
    });

I'm writing some JS code that uses promises. For example, I open a form pop-up and I return a jQuery Deferred object. It works like this:

  • If the user clicks OK on the form, and it validates, the Deferred resolves to an object representing the form data.

  • If the user clicks Cancel, then the Deferred resolves to a null.

What I'm trying to decide is should the Deferred instead reject, instead of resolve? More generally, I'm wondering when should I resolve to something like a null object, and when should I reject?

Here's some code demonstrating the two positions:

// Resolve with null.
var promise = form.open()
    .done(function (result) {
        if (result) {
            // Do something with result.
        } else {
            // Log lack of result.
        }
    });

// Reject.
var promise = form.open()
    .done(function (result) {            
        // Do something with result.            
    })
    .fail(function () {
        // Log lack of result.
    });
Share Improve this question asked Feb 12, 2013 at 20:54 cdmckaycdmckay 32.3k25 gold badges86 silver badges114 bronze badges 4
  • Seems like a design decision that is perfectly valid either way. – James Montagne Commented Feb 12, 2013 at 20:59
  • I don't think that one method is better than the other, but I usually associate fail with something going wrong such as an exception rather than a chosen value, i.e. failure to be able to fulfill the promise rather than pleting the promise with a certain value. – Explosion Pills Commented Feb 12, 2013 at 20:59
  • @ExplosionPills Yeah that's what I'm trying to get a handle on. So I should treat a promise rejection as the same severity as an exception? – cdmckay Commented Feb 12, 2013 at 21:01
  • 1 @cdmckay Well .. there's not really a should about it, but at least that's what jQuery seems to do with the ajax deferred objects. – Explosion Pills Commented Feb 12, 2013 at 21:01
Add a ment  | 

3 Answers 3

Reset to default 4

The semantics of your two strategies are not really the same. Explicitly rejecting a deferred is meaningful.

For instance, $.when() will keep accumulating results as long as the deferred objects it is passed succeed, but will bail out at the first one which fails.

It means that, if we rename your two promises promise1 and promise2 respectively:

$.when(promise1, promise2).then(function() {
    // Success...
}, function() {
    // Failure...
});

The code above will wait until the second form is closed, even if the first form is canceled, before invoking one of the callbacks passed to then(). The invoked callback (success or failure) will only depend on the result of the second form.

However, that code will not wait for the first form to be closed before invoking the failure callback if the second form is canceled.

Since it's user-controlled, I wouldn't treat it as a "failure". The first option seems cleaner.

Well, in both cases you would do something different, so i would say always either resolve it, or reject it. Do your form post on resolve, and on reject do nothing. Then, on always, close the form.

var promise = form.open()
.done(function (result) {            
    // Do something with result.            
})
.fail(function () {
    // Log lack of result.
})
.always(function() {
    // close the form.
})

If you aren't rejecting on cancel, when are you ever rejecting at all? at that point, why use a deferred object? You could reject on input error, but then you would have to generate a whole new promise if you wanted to allow them to fix it.


Deferreds don't really seem like the right thing to use here. I'd just use events.

发布评论

评论列表(0)

  1. 暂无评论