2013-03-14 1 views
2

у меня есть, если заявление в PHP:Как написать инструкцию non-blocking if в Node JS?

if ($isTrue && db_record_exists($id)) { ... } 
else { ... }; 

Первое условием является истинной/ложной булевой проверкой.

Второе условие вызывает функцию, чтобы увидеть, существует ли строка в таблице базы данных и возвращает значение true или false.

Я хочу переписать это условие в узле JS так, чтобы он не блокировался.

Я переписан db_record_exists следующим ...

function db_record_exists(id, callback) { 
    db.do("SELECT 1", function(result) { 
    if (result) { callback(true); } 
    else { callback(false); } 
); 
} 

... но я не могу видеть, как затем включить это в больше, если заявление, с булевой проверки. Например, следующий оператор не имеет смысла:

if (isTrue and db_record_exists(id, callback)) { 
... 
} 

Что такое «узел» способ написать это?

Любой совет будет очень благодарен.

Спасибо (заблаговременно) за вашу помощь.

+0

You возможно, потребуется попытаться изменить способ написания этой части. Запрос БД является асинхронным, и то, что вы пытаетесь сделать, - это синхронизация. – eburgos

ответ

6

Сначала проверьте переменную, затем проверьте результат асинхронного вызова внутри обратного вызова.

if (isTrue) db_record_exists(id, function(r) { 
    if (r) { 
     // does exist 
    } else nope(); 
}); 
else nope(); 

function nope() { 
    // does not exist 
} 
-4

Возможно, таким образом?

function db_record_exists(id, callback) { 
    db.do("SELECT 1", function(result) { callback(result ? true : false); }); 
} 
1

Вам нужно будет использовать обратные вызовы для части if и else. Тогда «гнездо» в и-условия:

if ($isTrue) { 
    db_record_exists(id, function(result) { 
     if (result) 
      doesExist(); 
     else 
      doesntExist(); 
    }); 
else 
    doesntExist(); 

Для удобства, вы можете обернуть все, что в вспомогательной функции (и если вам это нужно несколько раз, положить в библиотеке):

(function and(cond, async, suc, err) { 
    if (cond) 
     async(function(r) { (r ? suc : err)(); }); 
    else 
     err(); 
})($isTrue, db_record_exists.bind(null, id), function() { 
    … 
}, function() { 
    … 
});